"""
生成器进阶-send、close和throw方法

生成器：
    1.不只可以产出值，还可以接收值。
    2.启动生成器的两种方法：next()、send
"""


def gen_func():
    # 可以产出值，可以接收值（调用方传递来的值）
    html = yield "http://projectsedu.com"
    print(html)
    yield 2
    yield 3
    return "Google"


def use_gen_func():
    gen = gen_func()

    # 启动生成器的两种方法：next()、send
    # 在调用send发送非None值之前，我们必须启动一次生成器，方式有两种：1.gen.send(None) 2.next()
    # url = next(gen)
    url = gen.send(None)

    # download url
    html = "Apple"

    # send方法可以传递值进入生成器内部，同时还可以重启生成器执行到下一个yield的位置
    print(gen.send(html))
    # 输出结果：
    """
    Apple
    2
    """


def gen_close_func():
    yield "http://projectsedu.com"
    yield 2
    yield 3
    return "Google"


def use_gen_close_func():
    gen = gen_close_func()
    print(next(gen))

    # 关闭生成器
    gen.close()
    next(gen)
    # 输出结果：
    """
    http://projectsedu.com
    抛出StopIteration
    """


def gen_throw_func():
    try:
        yield "http://projectsedu.com"
    except Exception as e:
        print("处理异常", e)
    yield 2
    yield 3
    return "Google"


def use_gen_throw_func():
    gen = gen_throw_func()
    print(next(gen))

    # 加入异常
    gen.throw(Exception, "下载异常")
    print(next(gen))

    # 输出结果：
    """
    http://projectsedu.com
    处理异常 下载异常
    3
    """


if __name__ == '__main__':
    # use_gen_func()
    # use_gen_close_func()
    use_gen_throw_func()
